package com.qf.util;
import org.apache.tomcat.util.codec.binary.Base64;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * base64工具类
 * @version v1.0.0
 * @Description:
 * @author: 姜红凯
 * @date: 2022.04.12
 * @since 1.0
 */
public class Base64Util {

        /**
         * 图片转base64
         * @param image 待转化的图片
         * @return 返回base64编码
         */
        public static String image2Base64(BufferedImage image){
            String base64=null;
            ByteArrayOutputStream stream=new ByteArrayOutputStream();
            try {
                ImageIO.write(image,"png",stream);
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            //内存流转字节数组
            byte[] bytes = stream.toByteArray();
            //字节数组转化为base64
            return Base64.encodeBase64String(bytes);
        }

    /**
     * 文件转base64
     * @param fileName 文件的全路径名
     * @return 文件的base64编码
     */
    public static String file2Base64(String fileName){
        try {
            return image2Base64(ImageIO.read(new File(fileName)));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * base64转化为bufferedImage的方法
     * @param base64 base64编码
     * @return 图片
     */
    public static BufferedImage base64ToImage(String base64){
        //如果入参是空，就返回null
        if(base64==null||base64.length()==0){
            return null;
        }
        //进行解码，拿到字节数组
        byte [] bytes=Base64.decodeBase64(base64);
        //把字节数组还原为图片
        ByteArrayInputStream stream=new ByteArrayInputStream(bytes);
        try {
            return ImageIO.read(stream);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 把一个base64数据保存成文件.
     * @param base64 base64编码数据
     * @param fileName 文件的全路径名
     * @return 文件对象
     */
    public static File base64ToFile(String base64,String fileName){
        if(base64==null||base64.length()==0){
            return null;
        }
        //base64解码
        byte[] bytes = Base64.decodeBase64(base64);
        //实例文件
        File file=new File(fileName);
        if(!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //写入数据
        FileOutputStream fos=null;
        try {
            fos=new FileOutputStream(file);
            fos.write(bytes);
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                if(fos!=null){
                    fos.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return file;
    }






    public static void main(String[] args) {
        // 82 ,94
        byte[] bytes={108};
        String base64 = Base64.encodeBase64String(bytes);
        System.out.println(base64);
        //get传递参数对参数有要求
        //http://localhost:8080/p1/a/b?username=zhangsan&password=123456
        //实际我的意思是：一个人设置的用户名为“zhangsan&password=123456”
        //其实在实际开发中，get传递的参数需要用urlencoder   urldecoder
        //因为碰巧base64编码
        //可能存在=和/
    }

}
